package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomInteger;
import br.com.telescope.adsrt.dom.DomProperties;
import br.com.telescope.adsrt.dom.DomSourceCode;
import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.adsrt.lib.AdsException;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.adsrt.lib.Form;
import br.com.telescope.sql.ModelQuery;
import br.com.telescope.t2.EntityBinding;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.exception.Severity;
import br.com.telescope.t2.feature.CustomActionFeature;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.InsertFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.LookupFeature;
import br.com.telescope.t2.feature.UpdateFeature;
import br.com.telescope.t2.feature.ViewFeature;
import br.com.telescope.util.ObjectUtil;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Regras para os valores de variáveis nos planos de execuções.
 * <p>
 * Interface para manutenção de Regra para o valor de variável no plano 
 * de execução
 * <P>
 * Telescope origin: ZTEST.CAD_REGRA_VARIAVEL_PLANO_EXECUCAO
 * <P>
 * Base entity: ZTEST.REGRA_VARIAVEL_PLANO_EXECUCAO
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadRegraVariavelPlanoExecucao extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "ZTEST.CAD_REGRA_VARIAVEL_PLANO_EXECUCAO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Regras para os valores de variáveis nos planos de execuções");
    }
    
    protected EntRegraVariavelPlanoExecucao base;
    protected EntFormulaExecucao fmve;
    protected EntFormulaExecucao fvmn;
    protected EntFormulaExecucao fvmx;
    protected EntPontoPlanoExecucao pple;
    protected EntProcessoAplicativo prca;
    protected EntVariavelAplicativo vapl;
    protected EntRegraVariavelPlanoExecucao rec; // NEED_TJW1_COMPATIBILITY
    
    // Service parameters
    private DomId pIdPlanoExecucao;
    
    // Record items
    private DomInteger aNumeroIteracao;
    private DomText aValorDefault;
    private DomProperties aListaValores;
    private DomText aValorMinimoEsperado;
    private DomText aValorMaximoEsperado;
    private DomId aId;
    private DomId aVariavelAplicativoId;
    private DomId aPlanoExecucaoId;
    private DomId aPontoPlanoExecucaoId;
    private DomId aProcessoAplicativoId;
    private DomId aFormulaValorEsperadoId;
    private DomId aFormulaValorMinimoId;
    private DomId aFormulaValorMaximoId;
    private DomUpper aFmveNome;
    private DomSourceCode aFmveFormula;
    private DomUpper aFvmnNome;
    private DomSourceCode aFvmnFormula;
    private DomUpper aFvmxNome;
    private DomSourceCode aFvmxFormula;
    private DomInteger aPpleQuantidadeIteracoesPonto;
    private DomUpper aPrcaNome;
    private DomInteger aPrcaSequenciaExecucao;
    private DomUpper aVaplNome;
    private DomId aVaplAplicativoOperacaoId;
    
    // Query items
    
    @Override
    public String getBaseSql() {
        return "select BASE.*"
                + " , FMVE.NOME as FMVE_NOME"
                + " , FMVE.FORMULA as FMVE_FORMULA"
                + " , FVMN.NOME as FVMN_NOME"
                + " , FVMN.FORMULA as FVMN_FORMULA"
                + " , FVMX.NOME as FVMX_NOME"
                + " , FVMX.FORMULA as FVMX_FORMULA"
                + " , PPLE.QUANTIDADE_ITERACOES_PONTO as PPLE_QUANTIDADE_ITERACOES_PONTO"
                + " , PRCA.NOME as PRCA_NOME"
                + " , PRCA.SEQUENCIA_EXECUCAO as PRCA_SEQUENCIA_EXECUCAO"
                + " , VAPL.NOME as VAPL_NOME"
                + " , VAPL.APLICATIVO_OPERACAO_ID as VAPL_APLICATIVO_OPERACAO_ID"
                + " , FMVE.ID as Z_FMVE_ID"
                + " , FVMN.ID as Z_FVMN_ID"
                + " , FVMX.ID as Z_FVMX_ID"
                + " , PPLE.ID as Z_PPLE_ID"
                + " , PRCA.ID as Z_PRCA_ID"
                + " , VAPL.ID as Z_VAPL_ID"
                + " from REGRA_VARIAVEL_PLANO_EXECUCAO BASE"
                + " left join FORMULA_EXECUCAO FMVE on FMVE.ID = BASE.FORMULA_VALOR_ESPERADO_ID"
                + " left join FORMULA_EXECUCAO FVMN on FVMN.ID = BASE.FORMULA_VALOR_MINIMO_ID"
                + " left join FORMULA_EXECUCAO FVMX on FVMX.ID = BASE.FORMULA_VALOR_MAXIMO_ID"
                + " left join PONTO_PLANO_EXECUCAO PPLE on PPLE.ID = BASE.PONTO_PLANO_EXECUCAO_ID"
                + " left join PROCESSO_APLICATIVO PRCA on PRCA.ID = BASE.PROCESSO_APLICATIVO_ID"
                + " join VARIAVEL_APLICATIVO VAPL on VAPL.ID = BASE.VARIAVEL_APLICATIVO_ID";
    }
    
    @Override
    public void initAttributes() {
        
        aNumeroIteracao = new DomInteger();
        aNumeroIteracao.context(ctx).name("NUMERO_ITERACAO").label("Número da iteração");
        aNumeroIteracao.setDefaultValue("1");
        
        aValorDefault = new DomText();
        aValorDefault.context(ctx).name("VALOR_DEFAULT").label("Valor default");
        
        aListaValores = new DomProperties();
        aListaValores.context(ctx).name("LISTA_VALORES").label("Lista de valores");
        
        aValorMinimoEsperado = new DomText();
        aValorMinimoEsperado.context(ctx).name("VALOR_MINIMO_ESPERADO").label("Valor mínimo esperado");
        
        aValorMaximoEsperado = new DomText();
        aValorMaximoEsperado.context(ctx).name("VALOR_MAXIMO_ESPERADO").label("Valor máximo esperado");
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aVariavelAplicativoId = new DomId();
        aVariavelAplicativoId.context(ctx).name("VARIAVEL_APLICATIVO_ID").label("Variável do aplicativo");
        
        aPlanoExecucaoId = new DomId();
        aPlanoExecucaoId.context(ctx).name("PLANO_EXECUCAO_ID").label("Plano de execução");
        
        aPontoPlanoExecucaoId = new DomId();
        aPontoPlanoExecucaoId.context(ctx).name("PONTO_PLANO_EXECUCAO_ID").label("Ponto do plano de execução");
        
        aProcessoAplicativoId = new DomId();
        aProcessoAplicativoId.context(ctx).name("PROCESSO_APLICATIVO_ID").label("Processo do aplicativo");
        
        aFormulaValorEsperadoId = new DomId();
        aFormulaValorEsperadoId.context(ctx).name("FORMULA_VALOR_ESPERADO_ID").label("Fórmula (valor esperado)");
        
        aFormulaValorMinimoId = new DomId();
        aFormulaValorMinimoId.context(ctx).name("FORMULA_VALOR_MINIMO_ID").label("Fórmula (valor mínimo esperado)");
        
        aFormulaValorMaximoId = new DomId();
        aFormulaValorMaximoId.context(ctx).name("FORMULA_VALOR_MAXIMO_ID").label("Fórmula (valor máximo esperado)");
        
        aFmveNome = new DomUpper();
        aFmveNome.context(ctx).name("FMVE_NOME").label("Nome fórmula (valor esperado)");
        aFmveNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from FORMULA_EXECUCAO FMVE)", "q"));
        aFmveNome.setAutocompleteLength(1);
        
        aFmveFormula = new DomSourceCode();
        aFmveFormula.context(ctx).name("FMVE_FORMULA").label("Fórmula (valor esperado)");
        aFmveFormula.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT FORMULA as valor"
                + " , FORMULA as pesquisar"
                + " , FORMULA as descricao"
                + " from FORMULA_EXECUCAO FMVE)", "q"));
        aFmveFormula.setAutocompleteLength(1);
        
        aFvmnNome = new DomUpper();
        aFvmnNome.context(ctx).name("FVMN_NOME").label("Nome Fórmula (valor mínimo esperado)");
        aFvmnNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from FORMULA_EXECUCAO FVMN)", "q"));
        aFvmnNome.setAutocompleteLength(1);
        
        aFvmnFormula = new DomSourceCode();
        aFvmnFormula.context(ctx).name("FVMN_FORMULA").label("Fórmula (valor mínimo esperado)");
        aFvmnFormula.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT FORMULA as valor"
                + " , FORMULA as pesquisar"
                + " , FORMULA as descricao"
                + " from FORMULA_EXECUCAO FVMN)", "q"));
        aFvmnFormula.setAutocompleteLength(1);
        
        aFvmxNome = new DomUpper();
        aFvmxNome.context(ctx).name("FVMX_NOME").label("Nome Fórmula (valor máximo esperado)");
        aFvmxNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from FORMULA_EXECUCAO FVMX)", "q"));
        aFvmxNome.setAutocompleteLength(1);
        
        aFvmxFormula = new DomSourceCode();
        aFvmxFormula.context(ctx).name("FVMX_FORMULA").label("Fórmula (valor máximo esperado)");
        aFvmxFormula.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT FORMULA as valor"
                + " , FORMULA as pesquisar"
                + " , FORMULA as descricao"
                + " from FORMULA_EXECUCAO FVMX)", "q"));
        aFvmxFormula.setAutocompleteLength(1);
        
        aPpleQuantidadeIteracoesPonto = new DomInteger();
        aPpleQuantidadeIteracoesPonto.context(ctx).name("PPLE_QUANTIDADE_ITERACOES_PONTO").label("Quantidade de iterações neste ponto");
        aPpleQuantidadeIteracoesPonto.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT QUANTIDADE_ITERACOES_PONTO as valor"
                + " , QUANTIDADE_ITERACOES_PONTO as pesquisar"
                + " , QUANTIDADE_ITERACOES_PONTO as descricao"
                + " from PONTO_PLANO_EXECUCAO PPLE)", "q"));
        aPpleQuantidadeIteracoesPonto.setAutocompleteLength(2);
        aPpleQuantidadeIteracoesPonto.setDefaultValue("1");
        
        aPrcaNome = new DomUpper();
        aPrcaNome.context(ctx).name("PRCA_NOME").label("Nome do processo");
        aPrcaNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PROCESSO_APLICATIVO PRCA)", "q"));
        aPrcaNome.setAutocompleteLength(2);
        
        aPrcaSequenciaExecucao = new DomInteger();
        aPrcaSequenciaExecucao.context(ctx).name("PRCA_SEQUENCIA_EXECUCAO").label("Sequência de execução");
        aPrcaSequenciaExecucao.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SEQUENCIA_EXECUCAO as valor"
                + " , SEQUENCIA_EXECUCAO as pesquisar"
                + " , SEQUENCIA_EXECUCAO as descricao"
                + " from PROCESSO_APLICATIVO PRCA)", "q"));
        aPrcaSequenciaExecucao.setAutocompleteLength(2);
        
        aVaplNome = new DomUpper();
        aVaplNome.context(ctx).name("VAPL_NOME").label("Nome da variável");
        aVaplNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from VARIAVEL_APLICATIVO VAPL)", "q"));
        aVaplNome.setAutocompleteLength(2);
        
        aVaplAplicativoOperacaoId = new DomId();
        aVaplAplicativoOperacaoId.context(ctx).name("VAPL_APLICATIVO_OPERACAO_ID").label("Aplicativo de operação");
        aVaplAplicativoOperacaoId.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT APLICATIVO_OPERACAO_ID as valor"
                + " , APLICATIVO_OPERACAO_ID as pesquisar"
                + " , APLICATIVO_OPERACAO_ID as descricao"
                + " from VARIAVEL_APLICATIVO VAPL)", "q"));
        aVaplAplicativoOperacaoId.setAutocompleteLength(2);
        
    }
    
    @Override
    public void initParameters() {
        pIdPlanoExecucao = new DomId(ctx, "ID_PLANO_EXECUCAO", "Plano de execução");
        pIdPlanoExecucao.setValue(ctx.getParameter("P_ID_PLANO_EXECUCAO"));
        pIdPlanoExecucao.setSqlExpression("PLANO_EXECUCAO_ID");
        if (pIdPlanoExecucao.isNotNull()) {
            aPlanoExecucaoId.setValue(pIdPlanoExecucao.getValue());
        }
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pIdPlanoExecucao);
        }
        return allParameters;
    }
    
    @Override
    public void copyBindParameters() {
        EntRegraVariavelPlanoExecucao record = getRecord();
        if (pIdPlanoExecucao.isNotNull()) {
            record.setPlanoExecucaoId(pIdPlanoExecucao.getValue());
        }
    }
    
    @Override
    public void retrieveBindParameters() {
        pIdPlanoExecucao.setValue(getRecord().valueOfPlanoExecucaoId());
    }
    
    @Override
    public void initEntityBindings() {
        EntityBinding binding;
        
        binding = new EntityBinding("ZTEST.PONTO_PLANO_EXECUCAO", "PPLE", "Z_PPLE_ID", "ZTEST.CAD_PONTO_PLANO_EXECUCAO.VIEW");
        binding.addFields(aPpleQuantidadeIteracoesPonto);
        entityBindings.add(binding);
        
        binding = new EntityBinding("ZTEST.PROCESSO_APLICATIVO", "PRCA", "Z_PRCA_ID", "ZTEST.CAD_PROCESSO_APLICATIVO.VIEW");
        binding.addFields(aPrcaNome, aPrcaSequenciaExecucao);
        entityBindings.add(binding);
        
        binding = new EntityBinding("ZTEST.VARIAVEL_APLICATIVO", "VAPL", "Z_VAPL_ID", "ZTEST.CAD_VARIAVEL_APLICATIVO.VIEW");
        binding.addFields(aVaplNome, aVaplAplicativoOperacaoId);
        entityBindings.add(binding);
    }
    
    @Override
    public String getQueryPkColumn() {
        return "BASE.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntRegraVariavelPlanoExecucao getRecord() {
        if (base == null) {
            base = new EntRegraVariavelPlanoExecucao(ctx);
            rec = base;
        }
        return this.base;
    }
    
    @Override
    public String getContextName() {
        return aVaplNome.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "VAPL_NOME, PRCA_NOME, NUMERO_ITERACAO, VALOR_DEFAULT";
    }
    
    @Override
    public void translateInsertFks(Form form) {
        ModelQuery query;
        
        // PROCESSO_APLICATIVO_ID
        try {
            if (form.hasFields("PRCA_NOME")) {
                query = createQuery()
                        .select("PRCA.ID")
                        .from("PROCESSO_APLICATIVO", "PRCA")
                        .filter("PRCA.NOME", form.get("PRCA_NOME"))
                        ;
                base.setProcessoAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // VARIAVEL_APLICATIVO_ID
        try {
            if (form.hasFields("VAPL_NOME")) {
                query = createQuery()
                        .select("VAPL.ID")
                        .from("VARIAVEL_APLICATIVO", "VAPL")
                        .filter("VAPL.NOME", form.get("VAPL_NOME"))
                        ;
                base.setVariavelAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public void translateUpdateFks(Form form) {
        ModelQuery query;
        
        // PROCESSO_APLICATIVO_ID
        try {
            if (form.hasFields("PRCA_NOME")) {
                query = createQuery()
                        .select("PRCA.ID")
                        .from("PROCESSO_APLICATIVO", "PRCA")
                        .filter("PRCA.NOME", form.get("PRCA_NOME"))
                        ;
                base.setProcessoAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // VARIAVEL_APLICATIVO_ID
        try {
            if (form.hasFields("VAPL_NOME")) {
                query = createQuery()
                        .select("VAPL.ID")
                        .from("VARIAVEL_APLICATIVO", "VAPL")
                        .filter("VAPL.NOME", form.get("VAPL_NOME"))
                        ;
                base.setVariavelAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aVaplNome, "view");
            addField(aPrcaNome, "view");
            addField(aNumeroIteracao, "view");
            addField(aValorDefault, "view");
            addField(aListaValores, "view");
            addField(aValorMinimoEsperado, "view");
            addField(aValorMaximoEsperado, "view");
        }
        
        @Override
        public void onAction() {
            addSubmit(getFeature("CRIAR_MATRIZ_VARIAVEIS")).label("Criar matriz (variável x valor)");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="VIEW">
    public class FView extends ViewFeature {
        
        @Override
        public void initForm() {
            addField(aVaplNome, "view");
            addField(aPrcaNome, "view");
            addField(aNumeroIteracao, "view");
            addField(aValorDefault, "view");
            addField(aListaValores, "view");
            addField(aValorMinimoEsperado, "view");
            addField(aValorMaximoEsperado, "view");
        }
        
        {
            setFeatureName("VIEW");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends InsertFeature {
        
        @Override
        public void initForm() {
            aVaplNome.setOptional(false);
            addField(aVaplNome, "rqd");
            aPrcaNome.setOptional(false);
            addField(aPrcaNome, "rqd");
            aNumeroIteracao.setOptional(false);
            addField(aNumeroIteracao, "rqd");
            addField(aValorDefault, "opt");
            addField(aListaValores, "opt");
            addField(aValorMinimoEsperado, "opt");
            addField(aValorMaximoEsperado, "opt");
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends UpdateFeature {
        
        @Override
        public void initForm() {
            aVaplNome.setOptional(false);
            addField(aVaplNome, "rqd");
            aPrcaNome.setOptional(false);
            addField(aPrcaNome, "rqd");
            aNumeroIteracao.setOptional(false);
            addField(aNumeroIteracao, "rqd");
            addField(aValorDefault, "opt");
            addField(aListaValores, "opt");
            addField(aValorMinimoEsperado, "opt");
            addField(aValorMaximoEsperado, "opt");
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aVaplNome, "view");
            addField(aPrcaNome, "view");
            addField(aNumeroIteracao, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="CRIAR_MATRIZ_VARIAVEIS">
    public class FCriarMatrizVariaveis extends CustomActionFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public void execute() {
            try {
                criarMatrizVariaveis();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("CRIAR_MATRIZ_VARIAVEIS");
            setTitle("Criar matriz (variável x valor)");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="PRCA_NOME_LOOKUP">
    public class FPrcaNomeLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aPrcaNome.setEditable(true);
            addField(aPrcaNome, "opt");
            aPrcaSequenciaExecucao.setEditable(false);
            addField(aPrcaSequenciaExecucao, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("PRCA.NOME as PRCA_NOME")
                    .select("PRCA.SEQUENCIA_EXECUCAO as PRCA_SEQUENCIA_EXECUCAO")
                    .from("PROCESSO_APLICATIVO", "PRCA")
                    ;
        }
        
        {
            setFeatureName("PRCA_NOME_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="VAPL_NOME_LOOKUP">
    public class FVaplNomeLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aVaplNome.setEditable(true);
            addField(aVaplNome, "opt");
            aVaplAplicativoOperacaoId.setEditable(false);
            addField(aVaplAplicativoOperacaoId, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("VAPL.NOME as VAPL_NOME")
                    .select("VAPL.APLICATIVO_OPERACAO_ID as VAPL_APLICATIVO_OPERACAO_ID")
                    .from("VARIAVEL_APLICATIVO", "VAPL")
                    ;
        }
        
        {
            setFeatureName("VAPL_NOME_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FList());
        addFeature(new FView());
        addFeature(new FInsert());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FCriarMatrizVariaveis());
        addFeature(new FPrcaNomeLookup());
        addFeature(new FVaplNomeLookup());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "LIST";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public Integer getNumeroIteracao() {
        return aNumeroIteracao.getValue();
    }
    
    public void setNumeroIteracao(Integer value) {
        this.aNumeroIteracao.setValue(value);
    }
    
    public String getValorDefault() {
        return aValorDefault.getValue();
    }
    
    public void setValorDefault(String value) {
        this.aValorDefault.setValue(value);
    }
    
    public String getListaValores() {
        return aListaValores.getValue();
    }
    
    public void setListaValores(String value) {
        this.aListaValores.setValue(value);
    }
    
    public String getValorMinimoEsperado() {
        return aValorMinimoEsperado.getValue();
    }
    
    public void setValorMinimoEsperado(String value) {
        this.aValorMinimoEsperado.setValue(value);
    }
    
    public String getValorMaximoEsperado() {
        return aValorMaximoEsperado.getValue();
    }
    
    public void setValorMaximoEsperado(String value) {
        this.aValorMaximoEsperado.setValue(value);
    }
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getVariavelAplicativoId() {
        return aVariavelAplicativoId.getValue();
    }
    
    public void setVariavelAplicativoId(Long value) {
        this.aVariavelAplicativoId.setValue(value);
    }
    
    public Long getPlanoExecucaoId() {
        return aPlanoExecucaoId.getValue();
    }
    
    public void setPlanoExecucaoId(Long value) {
        this.aPlanoExecucaoId.setValue(value);
    }
    
    public Long getPontoPlanoExecucaoId() {
        return aPontoPlanoExecucaoId.getValue();
    }
    
    public void setPontoPlanoExecucaoId(Long value) {
        this.aPontoPlanoExecucaoId.setValue(value);
    }
    
    public Long getProcessoAplicativoId() {
        return aProcessoAplicativoId.getValue();
    }
    
    public void setProcessoAplicativoId(Long value) {
        this.aProcessoAplicativoId.setValue(value);
    }
    
    public Long getFormulaValorEsperadoId() {
        return aFormulaValorEsperadoId.getValue();
    }
    
    public void setFormulaValorEsperadoId(Long value) {
        this.aFormulaValorEsperadoId.setValue(value);
    }
    
    public Long getFormulaValorMinimoId() {
        return aFormulaValorMinimoId.getValue();
    }
    
    public void setFormulaValorMinimoId(Long value) {
        this.aFormulaValorMinimoId.setValue(value);
    }
    
    public Long getFormulaValorMaximoId() {
        return aFormulaValorMaximoId.getValue();
    }
    
    public void setFormulaValorMaximoId(Long value) {
        this.aFormulaValorMaximoId.setValue(value);
    }
    
    public String getFmveNome() {
        return aFmveNome.getValue();
    }
    
    public void setFmveNome(String value) {
        this.aFmveNome.setValue(value);
    }
    
    public String getFmveFormula() {
        return aFmveFormula.getValue();
    }
    
    public void setFmveFormula(String value) {
        this.aFmveFormula.setValue(value);
    }
    
    public String getFvmnNome() {
        return aFvmnNome.getValue();
    }
    
    public void setFvmnNome(String value) {
        this.aFvmnNome.setValue(value);
    }
    
    public String getFvmnFormula() {
        return aFvmnFormula.getValue();
    }
    
    public void setFvmnFormula(String value) {
        this.aFvmnFormula.setValue(value);
    }
    
    public String getFvmxNome() {
        return aFvmxNome.getValue();
    }
    
    public void setFvmxNome(String value) {
        this.aFvmxNome.setValue(value);
    }
    
    public String getFvmxFormula() {
        return aFvmxFormula.getValue();
    }
    
    public void setFvmxFormula(String value) {
        this.aFvmxFormula.setValue(value);
    }
    
    public Integer getPpleQuantidadeIteracoesPonto() {
        return aPpleQuantidadeIteracoesPonto.getValue();
    }
    
    public void setPpleQuantidadeIteracoesPonto(Integer value) {
        this.aPpleQuantidadeIteracoesPonto.setValue(value);
    }
    
    public String getPrcaNome() {
        return aPrcaNome.getValue();
    }
    
    public void setPrcaNome(String value) {
        this.aPrcaNome.setValue(value);
    }
    
    public Integer getPrcaSequenciaExecucao() {
        return aPrcaSequenciaExecucao.getValue();
    }
    
    public void setPrcaSequenciaExecucao(Integer value) {
        this.aPrcaSequenciaExecucao.setValue(value);
    }
    
    public String getVaplNome() {
        return aVaplNome.getValue();
    }
    
    public void setVaplNome(String value) {
        this.aVaplNome.setValue(value);
    }
    
    public Long getVaplAplicativoOperacaoId() {
        return aVaplAplicativoOperacaoId.getValue();
    }
    
    public void setVaplAplicativoOperacaoId(Long value) {
        this.aVaplAplicativoOperacaoId.setValue(value);
    }
    
    public Long getParameterIdPlanoExecucao() {
        return pIdPlanoExecucao.getValue();
    }
    
    public void setParameterIdPlanoExecucao(Long value) {
        pIdPlanoExecucao.setValue(value);
        aPlanoExecucaoId.setValue(value);
    }
    // </editor-fold>
    
    /**
     * Criar matriz (variável x valor).
     */
    public void criarMatrizVariaveis() throws AdsException {
        // <user-code id="21166924" parentId="21166899" hashcode="22bdc8ec" length="1426">
        // import br.com.telescope.t2.exception.Severity;
        
        if (pIdPlanoExecucao.isNull()) {
            ctx.pushError(GLOBAL_NAME + ".PARAMETRO_PLANO_NAO_INFORMADO",
                    Severity.WARNING,
                    "Parâmetro para identificação do plano de execução não informado! Atualização da matriz de variáveis não pode ser executada. Tente novamente.");
        } else {
            try {
                ctx.beginTransaction(); 
        
                EntPlanoExecucao plano = new EntPlanoExecucao(ctx);
                plano.find(pIdPlanoExecucao.getValue());
                if (plano.isNull()) {
                    ctx.pushError(GLOBAL_NAME + ".PLANO_NAO_CADASTRADO",
                            Severity.ERROR,
                            "Erro não esperado ao consultar o plano de ensaio (id: " + pIdPlanoExecucao.getValue() + ")!");
                } else {   
                    plano.criarMatrizVariaveisExecucao();
                }
                plano.close();
            } catch (Exception e) {
                ctx.pushError(GLOBAL_NAME + ".ERRO_CRIAR_MATRIZ_VALOR_X_VARIAVEL",
                        Severity.ERROR,
                        "Erro não esperado ao criar a matriz dos valores da variáveis para este plano de ensaio! - " + e.toString());
            } finally {
                rec.close();
            }
        
            try {
                if (ctx.hasErrors()) {
                    ctx.abortTransaction();
                } else {
                    ctx.endTransaction();
                }
            } catch (Exception e) {
                throw new AdsException(e);
            }
        }
        getFeature("LIST").run();
        // </user-code>
    }
    
    @Override
    public String getJsServiceFile() {
        return "ui/ztest/cad_regra_variavel_plano_execucao.js";
    }
}
